package com.quanyan.place.service;


import com.quanyan.api.APIResponse;
import com.quanyan.common.Plugin.Page;
import com.quanyan.common.Plugin.PageObj;
import com.quanyan.place.entity.*;
import com.quanyan.place.entity.apireq.*;
import com.quanyan.place.entity.apiresp.RespBizPeriodInfo;
import com.quanyan.place.entity.apiresp.RespPlaceGoodsTypeVo;
import com.quanyan.place.entity.apiresp.RespPlaceGoodsVo;
import com.quanyan.place.entity.apiresp.RespSupplierVo;
import com.quanyan.place.wrapper.PlaceOrderServiceWrapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

public interface PlaceGoodsService {

    PageObj<List<RespPlaceGoodsVo>> getPlaceGoodsList(ReqPlaceGoodsVo reqPlaceGoodsVo);

    PageObj<List<RespPlaceGoodsVo>> getPlaceGoodsListNew(ReqPlaceGoodsVo reqPlaceGoodsVo);

  /*  APIResponse insertPlaceGoodsInfo(ReqPlaceGoodsVo reqPlaceGoodsVo);*/

    APIResponse insertInventoryRecord(ReqPlaceGoodsVo reqPlaceGoodsVo);

    APIResponse insertPlaceGoodsInfo(ReqPlaceGoodsVo reqPlaceGoodsVo);

    APIResponse insertPlaceGoodsInfoNew(ReqPlaceGoodsVo reqPlaceGoodsVo);

    APIResponse updatePlaceGoodsInfo(ReqPlaceGoodsVo reqPlaceGoodsVo);

    APIResponse updatePlaceGoodsInfoNew(ReqPlaceGoodsVo reqPlaceGoodsVo);

    void deletePlaceGoodsInfo(ReqPlaceGoodsVo reqPlaceGoodsVo);

    List<RespPlaceGoodsVo> exportPlaceGoodsInfo(ReqPlaceGoodsVo reqPlaceGoodsVo);

    List<RespPlaceGoodsVo> exportPlaceGoodsInfoNew(ReqPlaceGoodsVo reqPlaceGoodsVo);

    APIResponse importPlaceGoodsInfo(ReqPlaceGoodsVo reqPlaceGoodsVo);

    APIResponse insertPlaceGoodsTypeData(ReqPlaceGoodsTypeVo reqPlaceGoodsTypeVo);

    List<TbBizPlaceGoodsType> getPlaceGoodsTypeData(ReqPlaceGoodsTypeVo reqPlaceGoodsTypeVo);

    /*PageObj<List<TbBizPlaceGoodsType>> getPlaceGoodsTypeList(ReqPlaceGoodsTypeVo reqPlaceGoodsTypeVo);*/

    PageObj<List<RespPlaceGoodsTypeVo>> getPlaceGoodsTypeList(ReqPlaceGoodsTypeVo reqPlaceGoodsTypeVo);

    APIResponse updatePlaceGoodsTypeData(ReqPlaceGoodsTypeVo reqPlaceGoodsTypeVo);

   /* APIResponse updatePlaceGoodsTypeDatassss(ReqPlaceGoodsTypeVo reqPlaceGoodsTypeVo);*/

    List<TbBizPlaceGoodsType> getGoodsTypeNameByTypeId(Integer typeId,Integer placeId);

    APIResponse  submitGoodsOrder(ReqPlaceGoodsVo reqPlaceGoodsVo) throws Exception;

    APIResponse submitGoodsOrderForScanPay(ReqPlaceGoodsVo reqPlaceGoodsVo,PlaceOrderServiceWrapper placeOrderServiceWrapper) throws Exception;

    RespPlaceGoodsVo goodsSaleIncomeReport(ReqPlaceGoodsVo reqPlaceGoodsVo);

    TbBizPlaceGoods getGoodsInfoByid(ReqPlaceGoodsVo reqPlaceGoodsVo);

    void updateGoodsInventory(List<TbBizPlaceOrderItem> tbBizPlaceOrderItemList,TbBizPlaceOrder tbBizPlaceOrder);

    void addGoodsInventory(TbBizPlaceOrder tbBizPlaceOrder,List<TbBizPlaceOrderItem> tbBizPlaceOrderItemList) throws Exception;
   /**
    * 部分退款增加库存
    * @param tbBizPlaceOrder
    * @param tbBizPlaceOrderItem
    * @param refundGoodsCount
    * @throws Exception
    */
    void addGoodsInventoryByPart(TbBizPlaceOrder tbBizPlaceOrder,TbBizPlaceOrderItem tbBizPlaceOrderItem,Integer refundGoodsCount) throws Exception;

    TbBizPlaceGoods getGoodsByGoodsId(String goodsId,Integer placeId);

    PageObj<List<RespPlaceGoodsVo>> inventoryRecordList(ReqPlaceGoodsVo reqPlaceGoodsVo);

    public TbBizPlaceGoodsInfo getGoodsInfoByGoods(ReqPlaceGoodsVo reqPlaceGoodsVo);

    public  List<Dict> getOneLevel(String dataKey);

    public List<TbBizPlaceGoodsType> getTypeByParenLevel(ReqPlaceGoodsVo reqPlaceGoodsVo);

    public TbBizPlaceGoodsInfo getGoodsInfoByGoodsId(String goodsId,Integer placeId);

    APIResponse saveSupplierInfo(ReqSupplierVo reqSupplierVo);

    PageObj<List<RespSupplierVo>> getSupplierInfoList(ReqSupplierVo reqSupplierVo);

    APIResponse deleteSupplierInfo(ReqSupplierVo reqSupplierVo);

    APIResponse updateSupplierInfo(ReqSupplierVo reqSupplierVo);

    List<TbSupplier> getSupplierNameByCityId(Integer cityId);

    APIResponse checkGoodsInventory(ReqPlaceGoodsVo reqPlaceGoodsVo);

    PageObj<List<RespPlaceGoodsVo>> goodsTradeRecord(ReqPlaceGoodsVo reqPlaceGoodsVo);

    void insertGoodsOperateRecord(ReqPlaceGoodsVo reqPlaceGoodsVo);

    List<RespPlaceGoodsVo> getGoodsTypeAndGoodsCount(Integer placeId);

    APIResponse<?> insertGoodsCommonType(@Param("map")Map<String, Object> map);

    APIResponse<?> updateGoodsCommonType(@Param("map")Map<String, Object> map);

    APIResponse<?> goodsTypeCommonList(@Param("map")Map<String, Object> map);

    APIResponse<?> insertGoodsCommon(ReqPlaceGoodsCommonVo reqPlaceGoodsCommonVo);

    APIResponse<?> updateGoodsCommon(ReqPlaceGoodsCommonVo reqPlaceGoodsCommonVo);

    APIResponse<?> goodsCommonList(@Param("map")Map<String, Object> map);

    List<TbBizPlaceGoodsTypeCommon> getTypeCommonByParentLevel(@Param("map")Map<String, Object> map);

    APIResponse<?> insertInventoryRecordBatch(ReqPlaceGoodsVo reqPlaceGoodsVo);

    APIResponse<?> checkGoodsInventoryBatch(ReqPlaceGoodsVo reqPlaceGoodsVo);

    APIResponse<?> updownGoods(ReqPlaceGoodsVo reqPlaceGoodVo);

    APIResponse<?> getGoodsInfoByBarCode(ReqPlaceGoodsVo reqPlaceGoodVo);

    APIResponse<?> insertGoodsAndList(@Param("map")Map<String, Object> map);
}
